package work.thread_eg.concurrent.cas;


import org.openjdk.jol.info.ClassLayout;
import work.entity.User;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS 比较和更新
 * AtomicInteger 原子类 实现递增 不用加锁
 *
 * CAS的比较和交换是汇编的一条原子性指令 是硬件级别的原子性操作 不会中断
 * CAS会导致ABA的问题 可以使用版本号来解决
 *
 * （synchronized和volatile 都和 lock cmpxchg汇编指令 有关)
 *
 * JVM只是个规范 具体的实现有 HotSpot (oracle的)  和 openjdk等
 */
public class CASTest {

    public static void main(String[] args) {
        AtomicInteger a = new AtomicInteger();
        // incrementAndGet()是改变对象本身的值 实现加1
        // incrementAndGet()实现了CAS原理 底层调用了native 关键字修饰的方法
        // native是C和C++实现的 最后是由汇编实现的 lock cmpxchg汇编指令
        //（synchronized和volatile 都和 lock cmpxchg汇编指令 有关)
        a.incrementAndGet();
        a.incrementAndGet();
        System.out.println(a);

        /**
         * JOL 可以看到内存布局 堆的内存布局 Object对象 16个字节 没有压缩还是16个字节
         * 指向class的指针默认4字节 （默认压缩指针) jdk 64位8字节压缩到4字节
         * new的对象的内存布局包括 markword + class pointer + instance data + padding 四部分
         * markword 8 字节 class pointer 4字节 对象头一共12个字节 instance data
         * 实例对象 成员变量空的 0字节 padding 对齐 4字节 (空的字节)
         * padding是为了凑到8的倍数
         *
         */
        Object o = new Object();
        System.out.println(ClassLayout.parseInstance(o).toPrintable());

        // User 28个字节
        User user = new User();
        System.out.println(ClassLayout.parseInstance(user).toPrintable());

        synchronized (o) {
            System.out.println(ClassLayout.parseInstance(o).toPrintable());
        }



    }
}
